home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / adasmall / test4.ada < prev    next >
Text File  |  1996-01-30  |  3KB  |  123 lines

  1. with SMALL_SP; use SMALL_SP;
  2. procedure TEST4 is
  3.  
  4.   -------------------------------------------------------------------------
  5.   -- This program demonstrates the Timed and Conditional entry calling   --
  6.   -- capability of SmallAda version 2.0.  
  7.   -- Task priority inheritance is also demonstrated.                     --                                               --
  8.   -------------------------------------------------------------------------
  9.  
  10.   SCREEN : SEMAPHORE;
  11.  
  12.   task R is
  13.     entry E1( CALLER : in character; D : in float);
  14.     entry E2;
  15.   end R;
  16.  
  17.   task A;
  18.   task B;
  19.   task C;
  20.  
  21.   task body R is
  22.     C : character;
  23.     DT : float;
  24.   begin
  25.     INHERITP(true);
  26.     WAIT(SCREEN);
  27.     CURSORAT(12,1); Put("TASK R RECEIVES CALLS FROM A,B,AND C");
  28.     SIGNAL(SCREEN);
  29.     loop
  30.       WAIT(SCREEN);
  31.       CURSORAT(13,1); Put("===>                      ");
  32.       SIGNAL(SCREEN);
  33.       accept E1(CALLER : in character; D : in float) do
  34.         C := CALLER;
  35.         DT := D;
  36.       end E1;
  37.       WAIT(SCREEN);
  38.       CURSORAT(13,1); Put("===> RENDEZVOUSED WITH "); Put(C);
  39.       SIGNAL(SCREEN);
  40.       delay DT;
  41.     end loop;
  42.     accept E2;
  43.   end R;
  44.  
  45.   task body A is
  46.   begin
  47.     WAIT(SCREEN);
  48.     CURSORAT(15,1); Put("TASK A DOES TIMED CALLS TO R");
  49.     SIGNAL(SCREEN);
  50.     loop
  51.       WAIT(SCREEN);
  52.       CURSORAT(16,1); Put("===> CALLING ....");
  53.       SIGNAL(SCREEN);
  54.       select
  55.         R.E1('A',2.0);
  56.         WAIT(SCREEN);
  57.         CURSORAT(16,1); Put("===> ACCEPTED    ");
  58.         SIGNAL(SCREEN);
  59.         delay 2.0;
  60.       or
  61.         delay 1.0;
  62.       end select;
  63.       WAIT(SCREEN);
  64.       CURSORAT(16,1); Put("===> DELAYED     ");
  65.       SIGNAL(SCREEN);
  66.       delay 3.0;
  67.     end loop;
  68.   end A;
  69.  
  70.   task body B is
  71.   begin
  72.     WAIT(SCREEN);
  73.     CURSORAT(18,1); Put("TASK B DOES CONDITIONAL CALLS TO R");
  74.     SIGNAL(SCREEN);
  75.     loop
  76.       WAIT(SCREEN);
  77.       CURSORAT(19,1); Put("===> CALLING ....");
  78.       SIGNAL(SCREEN);
  79.       select
  80.         R.E1('B',1.0);
  81.         WAIT(SCREEN);
  82.         CURSORAT(19,1); Put("===> ACCEPTED    ");
  83.         SIGNAL(SCREEN);
  84.         delay 1.0;
  85.       else
  86.         WAIT(SCREEN);
  87.         CURSORAT(19,1); Put("===> **FAILED**  ");
  88.         SIGNAL(SCREEN);
  89.         delay 1.0;
  90.       end select;
  91.       WAIT(SCREEN);
  92.       CURSORAT(19,1); Put("===> DELAYED     ");
  93.       SIGNAL(SCREEN);
  94.       delay 1.0;
  95.     end loop;
  96.   end B;
  97.  
  98.   task body C is
  99.   begin
  100.     Priority(100);
  101.     WAIT(SCREEN);
  102.     CURSORAT(21,1); Put("TASK C MAKES UNANSWERABLE CALLS WITH HIGH PRIORITY");
  103.     SIGNAL(SCREEN);
  104.     loop
  105.       WAIT(SCREEN);
  106.       CURSORAT(22,1); Put("===> CALLING (R's PRIORITY SHOULD JUMP)");
  107.       SIGNAL(SCREEN);
  108.       select
  109.         R.E2;
  110.       or
  111.         delay 2.0;
  112.       end select;
  113.       WAIT(SCREEN);
  114.       CURSORAT(22,1); Put("===> DELAYED (R's PRIORITY SHOULD DROP)");
  115.       SIGNAL(SCREEN);
  116.       delay 2.0;
  117.     end loop;
  118.   end C;
  119.  
  120. begin
  121.   SCREEN := 1;
  122. end TEST4;
  123.